(function ($) {

    // -----------------------------------
    // Rotinas comuns do framework de tela
    // -----------------------------------
    $.fw = {

        // -----------------------------------
        // Par�metros default para a chamada de servi�os
        // -----------------------------------
        servicoParametros: {
            async: true,
            processarErros: true,
            callbackErro: null
        },

        // -----------------------------------
        // Solicita execu��o de um servi�o para o servidor
        // -----------------------------------
        servico: function (tipoMensagem, mensagem, callbackOK, parametros) {

            // Junta os parametros
            if (!parametros)
                parametros = {};
            $.extend(parametros, $.fw.servicoParametros);

            // Inicializa as vari�veis
            var callbackId = null;
            var respostaSincrona = null;

            // Define a rotina que ir� preprocessar o retorno
            var processaRetorno = function (data) {

                // Deu erro?
                if (data.statusResposta != "OK" && parametros.processarErros) {

                    if (data.statusResposta == "ERRO_NEGOCIO" || data.statusResposta == "ERRO_VALIDAAO") {

                        // Mostra a lista de cr�ticas
                        $.fw.popupCritica({ criticaLista: data.criticaLista }, function () {

                            // Se tem callback de erro, chama
                            if (parametros.callbackErro) {
                                parametros.callbackErro();
                            }
                        });

                    } else {

                        // Se tem callback de erro, chama, se n�o, dispara erro
                        if (parametros.callbackErro) {
                            parametros.callbackErro();
                        } else {
                            // Dispara erro
                            throw new Error([
                                    data.DescricaoResposta ? data.DescricaoResposta : data.Erro,
                                    data.StatusResposta
                                ].join("|"));
                        }
                    }
                } else {

                    // Retorna: se for s�ncrono, retorna, se n�o, chama o callback
                    if (data.RequestTag == "sync") {
                        return data;
                    } else {
                        if (callbackOK)
                            callbackOK(data);
                    }

                }
            };

            // Faz a chamada do servico
            $.ajax({
                type: "POST",
                url: "thor",
                dataType: "json",
                //contentType: "application/json; charset=utf-8",
                data: {
                	tipoMensagem: tipoMensagem,
                    acao: "executar",
                	valores: $.toJSON(mensagem),
                    requestTag: parametros.async ? callbackId : "sync"
                },
                cache: false,
                success: function (r) {
                	//alert(r);
                    if(callbackOK)
                    	callbackOK(r);
                },
                error: function (e) { 
                	$("#mensagem").html(e.responseText);
                },
                async: parametros.async
            });

        },

        // -----------------------------------
        // Faz o repasse da chamada ao componente
        // -----------------------------------
        chamadaComponente: function (componente, chamada) {

            // Referencia para this
            var $this = $(this);

            // Interpreta os parametros
            var method = chamada[0];
            var arguments0 = chamada;

            // Method calling logic
            if ($[componente][method]) {
                return $[componente][method].apply($this, Array.prototype.slice.call(arguments0, 1));
            } else if (typeof method === "object" || !method) {
                return $[componente].abrir.apply($this, arguments0);
            } else {
                $.error("M�todo " + method + " n�o existe em " + componente);
            }

        },

        // -----------------------------------
        // Lista dos scripts carregados
        // -----------------------------------
        scriptLista: {},

        // -----------------------------------
        // Carrega o script solicitado
        // -----------------------------------
        script: function (param, callback) {

            var nomeScript = param.url.replace(".", "_");
            if (!$.fw.scriptLista[nomeScript]) {
                $.fw.scriptLista[nomeScript] = true;
                var carregado = false;
                var head = document.getElementsByTagName('head')[0];
                var scriptElement = document.createElement('script');
                scriptElement.type = 'text/javascript';
                scriptElement.onload = function () {
                    if (callback)
                        callback();
                }
                scriptElement.src = param.url;
                head.appendChild(scriptElement);
            } else {
                if (callback)
                    callback();
            }
        },

        // -----------------------------------
        // Carrega o elemento solicitado
        // param.nomeComponente: nome do componente
        // param.elemento: elemento que ir� receber o html
        // param.callbackCarregar: callback a ser executado caso tenha sido necess�rio o carregamento
        // callbackOK: callback final de retorno
        // -----------------------------------
        carregarComponente: function (param, callbackOK, callbackErro) {

            // Executa condicao para verificar se � necess�rio o carregamento
            if ($("#" + param.nomeComponente, param.elemento).length == 0) {

                // Executa a chamada ajax
                $.ajax({
                    url: param.nomeComponente + ".html",
                    dataType: "html",
                    contentType: "application/json; charset=utf-8",
                    success: function (data) {

                        // Filtra o elemento desejado
                        $("#areaTemporaria").append(data);
                        var html = $($("<div></div>").html($("#" + param.nomeComponente, "#areaTemporaria"))).html();
                        $("#areaTemporaria").empty();

                        // Insere no elemento
                        $(param.elemento).append(html);

                        // Se tiver param, passa o mesmo
                        var parametros = {};
                        if (param.param)
                            parametros = param.param;

                        // Callback de carregamento
                        if (param.callbackCarregar) {
                            // Callback de carregar
                            param.callbackCarregar(parametros, function () {
                                // Chama o callback final
                                if (callbackOK)
                                    callbackOK();
                            });
                        } else {
                            // Chama o callback final
                            if (callbackOK)
                                callbackOK();
                        }

                    },
                    async: true
                });

            } else {

                // N�o � necess�rio o carregamento, apenas chama o callback
                if (callbackOK)
                    callbackOK();
            }

        },

        // -----------------------------------
        // Verifica se o c�digo � do cache
        // -----------------------------------
        verificarCache: function (codigo) {
            // Se o c�digo for nulo, retorna falso
            if (codigo == null)
                return true;

            var index = codigo.indexOf('--');
            // Se n�o exite "=" � do banco, se n�o � cache
            if (index == -1)
                return false;

            return true;
        },

        // -----------------------------------
        // Carrega o script solicitado
        // -----------------------------------
        carregarScript: function (param, callbackOK, callbackErro) {
        },

        // -----------------------------------
        // Mostra dialog de mensagem
        // -----------------------------------
        popupMensagem: function (param, callbackOK) {

            // Referencia para this
            var $this = $(this);

            // Id do dialog
            var idElemento = "popupMensagem";
            var idDialog = idElemento + "_dialog";

            // Cria o elemento
            $("#areaComum").append("<div id='" + idDialog + "'></div>");

            // Pega o elemento
            var dialogElement = $("#" + idDialog);
            dialogElement.html(param.mensagem);

            // Inicializa o dialog
            dialogElement.dialog({
                autoOpen: false,
                width: $(window).width() - 50,
                height: $(window).height() - 60,
                minWidth: 900,
                minHeight: 650,
                modal: true,
                title: param.titulo,
                buttons: {
                    Fechar: function () {

                        // Fecha e remove o dialog
                        $("#" + idElemento, dialogElement).remove();
                        dialogElement.dialog("close").dialog("destroy").remove();

                        // Callback
                        if (callbackOK) callbackOK();

                    }
                }
            });

            // Mostra o dialog
            dialogElement.dialog("open");

        },

        // -----------------------------------
        // Mostra dialog com a lista de cr�ticas
        // -----------------------------------
        popupCritica: function (param, callbackOK) {
            
            var erros = "";

            for (var i = 0; i < param.criticaLista.length; i++) {

              erros += "Erro: " + (i+1) + " " + param.criticaLista[i].Descricao + "\n";
            }

            alert(erros);
        },

        // -----------------------------------
        // Declara a fun��o para converter data para json
        // -----------------------------------
        fJsonDate: function (jsonDate, formato) {
            var data = $.fw.fJsonDateObject(jsonDate);
            if (!formato) formato = "dd/MM/yyyy";
            data = $.format(data, formato);
            return data;
        },

        fJsonDateObject: function (jsonDate) {
            if (!jsonDate)
                return jsonDate;
            if (jsonDate.length == 10)
                jsonDate += " 00:00:00";
            var dia = $.trim(jsonDate.split("/")[0]);
            var mes = $.trim(jsonDate.split("/")[1]);
            var ano = $.trim(jsonDate.split(" ")[0].split("/")[2]);
            var hora = $.trim(jsonDate.split(":")[0].substr(10));
            var minuto = $.trim(jsonDate.split(":")[1]);
            var segundo = $.trim(jsonDate.split(":")[2]);

            var data = new Date(ano, mes - 1, dia, hora, minuto, segundo);
            return data;
        }

    };

})(jQuery);